/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ClassesListas;

import Biblioteca.VerificaErros;
import ClassesUnicas.LinhaMatrizConfusao;
import DAO.DAOMatrizConfusao;
import DAO.MySQL.DAOMatrizConfusaoMySQL;
import java.awt.Component;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

/**
 * LinhasMatrizConfusao
 *
 * Versao 1.0
 *
 * Data Criação 30/05/2013
 *
 * @author Igor
 */
public class LinhasMatrizConfusao {

    //Atributos
    private ArrayList<LinhaMatrizConfusao> linhasMatrizConfusao;
    private DAOMatrizConfusao matrizConfusaoDAO;

    //Construtores
    public LinhasMatrizConfusao() {
        this.linhasMatrizConfusao = new ArrayList<LinhaMatrizConfusao>();
        this.matrizConfusaoDAO = new DAOMatrizConfusaoMySQL();
    }

    //Getters e Setters
    /**
     * @return the linhasMatrizConfusao
     */
    public ArrayList<LinhaMatrizConfusao> getLinhasMatrizConfusao() {
        return linhasMatrizConfusao;
    }

    /**
     * @param linhasMatrizConfusao the linhasMatrizConfusao to set
     */
    public void setLinhasMatrizConfusao(ArrayList<LinhaMatrizConfusao> linhasMatrizConfusao) {
        this.linhasMatrizConfusao = linhasMatrizConfusao;
    }

    /**
     * @return the matrizConfusaoDAO
     */
    public DAOMatrizConfusao getMatrizConfusaoDAO() {
        return matrizConfusaoDAO;
    }

    /**
     * @param matrizConfusaoDAO the matrizConfusaoDAO to set
     */
    public void setMatrizConfusaoDAO(DAOMatrizConfusao matrizConfusaoDAO) {
        this.matrizConfusaoDAO = matrizConfusaoDAO;
    }

    //Outros metodos
    /**
     * Lista, o ArrayList de pessoas, na tabela passada como parametro
     *
     * @param tabela
     */
    public void listarLinhasMatrizConfusao(JTable tabela, boolean tempoResposta) {
        String[] colunas = new String[]{};
        if(tempoResposta){
            colunas = new String[]{"Descricao", "Neutro", "Tempo0", "Alegria", "Tempo1", "Medo", "Tempo2", "Nojo", "Tempo3", "Raiva", "Tempo4", "Surpresa", "Tempo5", "Triste", "Tempo6", "Nulo", "Total"};
        }else{
            colunas = new String[]{"Descricao", "Neutro", "Alegria", "Medo", "Nojo", "Raiva", "Surpresa", "Triste", "Nulo", "Total"};
        }
        
        DefaultTableModel dtm = (DefaultTableModel) tabela.getModel();
        dtm = new DefaultTableModel(colunas, 0) {
            @Override
            public boolean isCellEditable(int row, int col) {
                return col < 0 || col > 100;
            }
        };

        tabela.setModel(dtm);

        tabela.getColumnModel().getColumn(0).setPreferredWidth(100);
        
        CellRendererToolTip renderer = new CellRendererToolTip();
        //Configura a apresentacao dos Hints das linhas
        for (int i = 0; i < tabela.getColumnCount(); i++) {
            tabela.getColumn(tabela.getColumnName(i)).setCellRenderer(renderer);
        }

        int i = 0;
        while (i < linhasMatrizConfusao.size()) {
            String descricao = linhasMatrizConfusao.get(i).getDescricao();
            String neutro = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoNeutro());
            String tempoRespota0 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaNeutro());
            String alegria = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoAlegria());
            String tempoRespota1 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaAlegria());
            String medo = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoMedo());
            String tempoRespota2 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaMedo());
            String nojo = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoNojo());
            String tempoRespota3 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaNojo());
            String raiva = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoRaiva());
            String tempoRespota4 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaRaiva());
            String supresa = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoSurpresa());
            String tempoRespota5 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaSurpresa());
            String triste = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoTriste());
            String tempoRespota6 = Long.toString(linhasMatrizConfusao.get(i).getTempoRespostaTriste());
            String nulo = Long.toString(linhasMatrizConfusao.get(i).getAvaliacaoNulo());
            String total = Long.toString(linhasMatrizConfusao.get(i).getTotal());

            if(tempoResposta){
                dtm.addRow(new Object[]{descricao, neutro, tempoRespota0, alegria, tempoRespota1, medo, tempoRespota2, nojo, tempoRespota3, raiva, tempoRespota4, supresa, tempoRespota5, triste, tempoRespota6, nulo, total});   // um "" para cada coluna
            }else{
                dtm.addRow(new Object[]{descricao, neutro, alegria, medo, nojo, raiva, supresa, triste, nulo, total});   // um "" para cada coluna
            }
            i++;
        }
        dtm.getRowCount();
    }

    /**
     * Realiza a gravacao da Matriz de Confusao no caminho passado como parametro
     * @param textoAntes
     * @param caminho
     * @param textoDepois
     * @return 
     */
    public boolean gravaMatrizConfusaoArquivo(String textoAntes, String caminho, String textoDepois, boolean tempoResposta) {
        try {
            FileWriter arq = new FileWriter(caminho + ".txt");
            PrintWriter gravarArq = new PrintWriter(arq);
            gravarArq.printf(textoAntes);
            gravarArq.printf("%n");
            gravarArq.printf("Descricao;Neutro;Tempo0;Alegria;Tempo1;Medo;Tempo2;Nojo;Tempo3;Raiva;Tempo4;Surpresa;Tempo5;Triste;Tempo6;Nulo;Total;%n");
            for (int i = 0; i < linhasMatrizConfusao.size(); i++) {
                gravarArq.printf(linhasMatrizConfusao.get(i).getDescricao().toString() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoNeutro() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaNeutro() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoAlegria() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaAlegria() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoMedo() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaMedo() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoNojo() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaNojo() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoRaiva() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaRaiva() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoSurpresa() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaSurpresa() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoTriste() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTempoRespostaTriste() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getAvaliacaoNulo() + ";");
                gravarArq.printf(linhasMatrizConfusao.get(i).getTotal() + ";");
                gravarArq.printf("%n");
            }
            gravarArq.printf(textoDepois);
            gravarArq.printf("%n");
            arq.close();
            return true;
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
}

/**
 * Classe utilizada para buscar/apresentar o ToolTip (Hint) das linhas
 * @author Igor
 * Criação 02/07/2014
 */
class CellRendererToolTip extends DefaultTableCellRenderer {

    // Mantém a linha atual que este objeto está renderizando.   
    private int row;
    private JTable tabela;

    // Busca qual é a linha atual.   
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        this.row = row;
        this.tabela = table;

        return c;
    }

    // Retorna o tooltip
    public String getToolTipText() {
        return tabela.getValueAt(this.row, 0).toString();
    }
}
